#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Create by zhang
# Create on 2022/6/22 16:37
from domain.report.common.period_enum import PeriodEnum
from domain.report.dto.profit_dto import ProfitDTO
from domain.report.repository.profit_repository import get


class Profit(ProfitDTO):
    def __init__(self, dto:ProfitDTO=None):
        super(Profit, self).__init__()
        if dto:
            self.__dict__ = dto.__dict__

    @classmethod
    def query(cls, stock_code:str, year:int, period:PeriodEnum, is_consolidate:bool=False):
        dto = get(stock_code, year, period, is_consolidate)
        entity = Profit()
        entity.__dict__ = dto.__dict__
        return entity

    def get_gross_profit(self):
        """
        毛利 = 营业收入 - 营业成本
        """
        return self.revenue - self.operating_cost

    def get_core_profit(self):
        """
        核心利润 = 毛利 - 税金及附加 - 期间费用
        期间费用 = 销售费用 + 管理费用 + 财务费用
        """
        return self.get_gross_profit() - self.operating_taxes_and_surcharge - (self.sales_fee + self.manage_fee + self.financing_expenses)

    def get_net_sales_on_credit(self):
        """
        赊销净额:是通过赊销取得的收入。通常企业通过赊销和现销两种方式进行销售，应收账款是在赊销过程中产生的。但是通常赊销净额只有内部人员才能得到，
        所以实践中通常用营业收入来代替，也就是将现销视为回收期为零的应收账款，所以如果企业销售中赊销比例较小，计算得到的周转率就会较大。
        """
        return self.revenue

    def get_earnings_before_interest(self):
        """
        息税前利润（earnings before interest）是指扣除利息和税务支出之前的利润，可以用总利润加利息费用求得，用来说明是否有足够的利润支付到期的利息
        息税前利润 = 总利润+利息费用
        利息费用的数据难以得到（在上市公司合并报表的财务费用附注中有可能找到这项数据），因为在我国的会计实务中是将利息费用计入财务费用的，
        而不单独记录（财务费用中开包括利息收入、手续费记忆汇兑损益等）。在这种情况下，分析人员通常用财务费用代替利息费用进行计算，但这样会存在一定的误差。
        """
        return self.total_profit + self.financing_expenses

    def interest_coverage(self):
        """
        利息保障倍数（interest coverage）
        利息保障倍数 = 息税前利润/利息费用
        息税前利润 = 总利润+利息费用
        利息费用 ≈ 财务费用
        """
        return self.get_earnings_before_interest()/self.financing_expenses

    def fixed_charge_covered(self):
        """
        固定支出保障倍数（fixed charge covered）
        固定支出保障倍数 = 息税前利润/固定支出费用
        息税前利润 = 总利润+利息费用
        利息费用 ≈ 财务费用
        固定支出费用 = 金融资产利息支出 + 保单红利支出 + 销售费用 + 管理费用 + 财务费用 + 资产减值损失
        """
        return (self.total_profit + self.financing_expenses) / (self.interest_fee + self.div_payt + self.sales_fee + self.manage_fee + self.financing_expenses + self.assets_impair_loss)

    def gross_profit_ratio(self):
        """
        毛利率（gross profit ratio）
        毛利率 = 毛利/营业收入
        """
        return self.get_gross_profit()/self.revenue

    def core_profit_sales_ratio(self):
        """
        核心利润率（core profit to sales ratio）
        核心利润率 = 核心利润/营业收入
        """
        return self.get_core_profit()/self.revenue

    def total_sale_expense_ratio(self):
        """
        总营业费用率（total operating expenses to sales ratio)
        总营业费用率 = 总营业费用/营业收入
        总营业费用 = 销售费用 + 管理费用
        """
        return (self.manage_fee + self.sales_fee) / self.revenue

    def net_profit_margin(self):
        """
        销售净利率（net profit margin）
        销售净利率 = 净利润/营业收入
        """
        return self.net_profit / self.revenue